package com.JUC;

import java.util.concurrent.CompletableFuture;

public class JUC15_CompletableFuture {
    public static void main(String[] args) throws Exception {
        // runAsync  没有返回值
        // 需要传入一个 Runnable 接口类型的参数
//        CompletableFuture<Void> completableFuture1 = CompletableFuture.runAsync(() -> {
//            System.out.println(Thread.currentThread().getName() + "执行任务--runAsync--没有返回");
//        });
//        completableFuture1.get();

        // supplyAsync 有返回
        // 需要传入一个 Supplier 类型的参数，Supplier类型可以没有输入参数
        CompletableFuture<Integer> completableFuture2 = CompletableFuture.supplyAsync(() -> {
            System.out.println(Thread.currentThread().getName() + "执行任务--supplyAsync--有返回");

            // 模拟异常
            int a = 10 / 0;

            return 1024;
        });
        // whenComplete : 参数列表 (T t, U u),如果执行过程正常完成，则执行该分支
        // exceptionally :  , 如果执行过程出现异常，则走该分支
        System.out.println(completableFuture2.whenComplete((t, u) -> {
            System.out.println("-----t(异步回调，输出结果):" + t);
            System.out.println("-----u(执行过程中的异常信息):" + u);
        }).exceptionally((f) -> {
            // 打印异常信息
            System.out.println("+++++++Exception: " + f.getMessage());
            return 9999;
        }).get());
        // 这里的 .get() 方法，获取任务的执行结果
        // 如果在正常执行的情况下，则得到任务的返回值 —— 1024
        // 如果出现异常，则返回 exceptionally() 中异常处理时设置的返回值 —— 9999
        // 可以把用 System.out.print 打印验证

    }
}
